﻿using System;
using System.Collections.Generic;
using Contact.Contracts.Common;
using EFDataModel;
using System.Linq;

namespace Contact.Contracts.Models.Worktime
{
    public interface IWorktime : IBaseContracts
    {
        /// <summary>
        /// Ermittelt alle Arbeitszeiteinträge für den übergebenen User.
        /// </summary>
        /// <param name="userId">Die UserId für die die Arbeitszeiteinträge ermittelt werden sollen</param>
        IQueryable<EFWorktime> GetWorktimeList(long userId);

        /// <summary>
        /// Ermittelt alle Worktime Einträge für den Monat des übergebenen Datums
        /// </summary>
        /// <param name="userId">Die UserId nach der gesucht werden soll</param>
        /// <param name="day">Aus dem Datum wird der Monat ermittelt und dafür alle Einträge herausgesucht.</param>
        IQueryable<EFWorktime> GetWorktimeByMonth(long userId, DateTime day);

        /// <summary>
        /// Ermittelt alle Worktime Einträge für den übergebenen Zeitraum
        /// </summary>
        /// <param name="userId">Die UserId nach der gesucht werden soll</param>
        /// <param name="startDay">Das Startdatum von es aus die Arbeitszeiteinträge ermittelnt werden sollen</param>
        /// <param name="endDay">Das Endedatum zu dem alle Arbeitszeiteinträge ermittelt werden sollen.</param>
        IQueryable<EFWorktime> GetWorktime(long userId, DateTime startDay, DateTime endDay);

        /// <summary>
        /// Löschen des übergebenen Arbeitszeiteintrags aus der Datenbank
        /// </summary>
        /// <param name="worktimeEntryId">ArbeitszeiteintragsId</param>
        /// <returns>TRUE->Löschen erfolgreich | FALSE->Fehler beim Löschen</returns>
        bool DeleteWorktimeEntry(long worktimeEntryId);

        /// <summary>
        /// Ermitteln eines Arbeitszeit Eintrags anhand der übergebenen ID
        /// </summary>
        /// <param name="userId">die zugehörige Userid für den Arbeitszeiteintrag</param>
        /// <param name="worktimeId">Die Id des Arbeitszeiteintrages der herausgesucht werden soll</param>
        EFWorktime GetWorktime(long userId, long worktimeId);
        
        /// <summary>
        /// Ermitteln eines Arbeitszeit Eintrags anhand des übergebenen Datums
        /// </summary>
        /// <param name="userId">die zugehörige Userid für den Arbeitszeiteintrag</param>
        /// <param name="date">der Tag für den der Arbeitszeiteintrag geladen werden soll</param>
        EFWorktime GetWorktime(long userId, DateTime date);

        /// <summary>
        /// Ermitteln eines Arbeitszeit Eintrags anhand der übergebenen ID
        /// </summary>
        /// <param name="userId">die zugehörige Userid für den Arbeitszeiteintrag</param>
        /// <param name="worktimeEntryId">Die Id des Arbeitszeiteintrages der herausgesucht werden soll</param>
        EFWorktimeEntry GetWorktimeEntry(long userId, long worktimeEntryId);

        /// <summary>
        /// Speichern des übergebenen Arbeitszeiteintrages
        /// </summary>
        /// <param name="entry">der Arbeitszeiteintrag der gespeichert werden soll</param>
        bool SaveWorktimeEntry(EFWorktimeEntry entry, EFWorktime worktime);

        /// <summary>
        /// Speichern des übergebenen Wortime Objektes
        /// </summary>
        /// <param name="worktime">Die worktime die gespeichert werden soll</param>
        bool SaveWorktimeEntry(EFWorktime worktime);

        /// <summary>
        /// Anlegen und dann Speichern des übergebenen Arbeitszeiteintrages
        /// </summary>
        /// <param name="entry">der Arbeitszeiteintrag der angelegt werden soll</param>
        bool AddWorktimeEntry(EFWorktimeEntry entry);

        /// <summary>
        /// Ermittelt die Arbeitszeiteinträge für den übergebenen Tag
        /// </summary>
        /// <param name="userId">Die Userid für die die Daten herausgesucht werden sollen </param>
        /// <param name="day">Der Tag für den die Arbeitszeiteinträge ermittelt werden sollen</param>
        IQueryable<EFWorktimeEntry> GetWorktimeEntriesByDay(long userId, DateTime day);

        /// <summary>
        /// Ermittelt die Arbeitszeiteinträge für den übergebenen Tag
        /// </summary>
        /// <param name="userId">Die Userid für die die Daten herausgesucht werden sollen </param>
        /// <param name="type">Der Arbeitstagtyp nach dem gesucht werden soll, z.B. Arbeitszeit, Urlaub, ... </param>
        /// <param name="day">Der Tag für den die Arbeitszeiteinträge ermittelt werden sollen</param>
        IQueryable<EFWorktimeEntry> GetWorktimeEntriesByDayAndType(long userId, EWorktimeType type, DateTime day);

        /// <summary>
        /// Ermittelt die letzten XX (count) Einträge an Arbeitszeiteinträgen für den übergebenen User.
        /// </summary>
        /// <param name="userId">Die UserId nach der gesucht werden soll</param>
        /// <param name="count">Die Anzahl der Einträge die herausgesucht werden sollen</param>
        IQueryable<EFWorktimeEntry> GetLastWorktimeEntries(long userId, int count);

        /// <summary>
        /// Gibt alle Arbeitszeiteinträge für den übergebenen User zurück
        /// </summary>
        /// <param name="userId">Die UserId für die die Arbeitszeiteinträge heruntergeladen werden sollen.</param>
        IQueryable<EFWorktimeEntry> GetAllWorktimeEntries(long userId);
    }
}
